{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "99d82347",
   "metadata": {},
   "source": [
    "# Сравнение скорости архетектур сетевого файлообмена\n",
    "Мой проект по распределенному файлообмену в сети - <a href=\"https://github.com/funcid/peas-cli\">Peas CLI</a>, для его оценки работы, я хочу рассмотреть идеальный сценарий файлообменов с помощью компьютерного моделирования."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3f5ed89b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d061aa0b",
   "metadata": {},
   "source": [
    "## Моделирование систем\n",
    "Построим собственную модель исходя и принципов Peas и проверим ее на идеальных примерах чтобы получить закономерность. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "aa681c53",
   "metadata": {},
   "outputs": [],
   "source": [
    "file_size = 1 << 8 # размер раздаваемого файла\n",
    "file = np.arange(file_size) \n",
    "partition_size = 1 # размер одной партиции"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7edac30f",
   "metadata": {},
   "outputs": [],
   "source": [
    "class ClientServer:\n",
    "    def __init__(self, id, partitions, clients, tcp_speed):\n",
    "        self.id = id\n",
    "        self.partitions = partitions\n",
    "        self.clients = clients\n",
    "        self.tcp_speed = tcp_speed\n",
    "        self.tcp_speed_copy = tcp_speed\n",
    "    \n",
    "    def is_downloaded(self):\n",
    "        return file_size <= len(self.partitions)\n",
    "    \n",
    "    def __str__(self):\n",
    "        return f'N{self.id}: {len(self.partitions) / file_size * 100}%'\n",
    "    \n",
    "    def exchange(self, server):\n",
    "        self.partitions.append(len(self.partitions))\n",
    "        server.tcp_speed_copy -= partition_size\n",
    "        self.tcp_speed_copy -= partition_size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "44607e28",
   "metadata": {},
   "outputs": [],
   "source": [
    "def download_partition_decentralized(client):\n",
    "    for server in client.clients:\n",
    "        # сами у себя партиции не берем\n",
    "        if server == client or server.tcp_speed_copy < partition_size or client.tcp_speed_copy < partition_size:\n",
    "            continue\n",
    "        # берем только с тех серверов, на которых есть недостающие партиции\n",
    "        if len(server.partitions) < len(client.partitions):\n",
    "            continue\n",
    "            \n",
    "        client.exchange(server)\n",
    "\n",
    "def download_partition_centralized(client):\n",
    "    for server in client.clients:\n",
    "        if server == client or server.tcp_speed_copy < partition_size or client.tcp_speed_copy < partition_size:\n",
    "            continue\n",
    "            \n",
    "        # этот клиент не может скачивать, пока не истратит сеть предыдущий\n",
    "        prev = client.clients.index(client) - 1\n",
    "        if prev > 0 and not client.clients[prev].is_downloaded():\n",
    "            break\n",
    "        \n",
    "        client.exchange(server)\n",
    "        return True\n",
    "        \n",
    "def do_step(nodes, linear):\n",
    "    \n",
    "    for server in nodes:\n",
    "        server.tcp_speed_copy = server.tcp_speed\n",
    "    \n",
    "    for client in nodes:\n",
    "        if client.is_downloaded():\n",
    "            continue\n",
    "        \n",
    "        # нужно скачивать партиции и серверов раздачи\n",
    "        if linear:\n",
    "            download_partition_centralized(client)\n",
    "        else:\n",
    "            if download_partition_decentralized(client):\n",
    "                break\n",
    "\n",
    "def prepare(peas_count, tcp_speed):\n",
    "    \n",
    "    empty_clients = []\n",
    "    for i in range(peas_count - 1):\n",
    "        empty_clients.append(ClientServer(i, [], [], tcp_speed))\n",
    "        \n",
    "    nodes = [\n",
    "        ClientServer(peas_count, file, [], tcp_speed),\n",
    "        *empty_clients\n",
    "    ]\n",
    "    \n",
    "    for multicast in nodes:\n",
    "        multicast.clients = nodes\n",
    "    \n",
    "    return nodes\n",
    "        \n",
    "def simulate(peas_count, tcp_speed, linear, debug = False):\n",
    "\n",
    "    nodes = prepare(peas_count, tcp_speed)\n",
    "    \n",
    "    operation_count = 0\n",
    "    \n",
    "    while not all(x.is_downloaded() for x in nodes):\n",
    "        operation_count += 1\n",
    "        do_step(nodes, linear)\n",
    "        \n",
    "        if debug and operation_count % 1000 == 0:\n",
    "            for server in nodes:\n",
    "                print(server)\n",
    "    \n",
    "    if debug:\n",
    "        for server in nodes:\n",
    "            print(server)\n",
    "        \n",
    "    return operation_count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b9a4ba19",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "values = np.arange(2, 10)\n",
    "\n",
    "plt.plot(values, list(map(lambda x: simulate(x, 100, True), values)), color = 'blue', label = 'централизованный файлообмен')\n",
    "plt.plot(values, list(map(lambda x: simulate(x, 100, False), values)), color = 'red', label = 'децентрализованный файлообмен')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27906d9a",
   "metadata": {},
   "source": [
    "## Сравнение\n",
    "Мы видим следующую картину, централизованная раздача имеет линейную функцию, а децентрализованный файлообмен имеет экспоненциальную, при росте числа участников сети, тем больше разница в общей производительности между видами раздачи."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65c5b2e5",
   "metadata": {},
   "source": [
    "<strong>Централизованная архитектура файлообмена (линейная) -</strong>\n",
    "\n",
    "$T = \\frac{S*N}{V}$, где $T$ - время загрузки, $S$ - размер файла, $V$ - пропускная способность сети, $N$ - количество участников сети без оригинального сервера - источника"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6dd57839",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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z685MFlkjGHIkCEsWrSIb7/9lipVqthdku0yMzNJSUmxu4w807p1a3bv3k1cXJzr1rBhQ3r06EFcXBze3t52l5inkpOTOXToEKGhoXaXkmeaNm16xfIJP/30ExERETZVZI/Zs2cTHBxMVFSU3aXkqQsXLuDl5f616e3tTWZmpk0V2atEiRKEhoZy5swZli9fzv3335+nz1+4roG8ATExMcybN48vvvgCf39/EhISAAgMDMTPz8/m6nLfmDFj6NChA5UqVeLcuXPMmzePNWvWsHz5crtLyzP+/v7cfvvtbveVKFGCMmXKXHF/QfTMM8/QqVMnIiIiOH78OOPGjcPb25tu3brZXVqeGT58OHfeeSeTJk3ikUceYcuWLcyaNYtZs2bZXVqeyczMZPbs2fTu3bvQXUbfqVMnXnzxRSpVqkTNmjXZsWMH06dPp1+/fnaXlqeWL1+OMYZq1apx8OBBRo4cyW233Ubfvn3ztpA87e/xYMBVb7Nnz7a7tDzRr18/ExERYXx8fEy5cuVM69atzYoVK+wuy3aFaQ7Mo48+akJDQ42Pj4+pUKGCefTRR83BgwftLivPffXVV+b22283vr6+5rbbbjOzZs2yu6Q8tXz5cgOY/fv3211KnnM6nebJJ580lSpVMsWKFTM33XSTee6550xKSordpeWphQsXmptuusn4+PiYkJAQExMTY86ePZvndTiMKWRLCIqIiIjH0xwYERER8TgKMCIiIuJxFGBERETE4yjAiIiIiMdRgBERERGPowAjIiIiHkcBRkRERDyOAoyIiIh4HAUYERER8TgKMCIiIuJxFGBERETE4yjAiIiIiMf5f7bKSdXuSiEuAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "values = np.arange(2, 10)\n",
    "\n",
    "plt.plot(values, list(map(lambda x: simulate(x, 100, True), values)), color = 'blue', label = 'централизованный файлообмен')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a676fb78",
   "metadata": {},
   "source": [
    "<strong>Децентрализованная архитектура файлообмена (параллельная) -</strong>\n",
    "\n",
    "$T = \\frac{S}{V*N}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c190ab87",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGdCAYAAAA44ojeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8xElEQVR4nO3deVyU9d7/8fcAgiAwIy4siUtq7gu5hbbYkVyzLMvqcErLNAtPbqV5OpqnczpkWcfsrmxTz7lvzeqXtpjarbiVoSm55JKpobiBpgGiItv1+2NuRgYBWWa4WF7Px+N6MFzXd675cI0yb77X9/peFsMwDAEAAFQhHmYXAAAAUBgBBQAAVDkEFAAAUOUQUAAAQJVDQAEAAFUOAQUAAFQ5BBQAAFDlEFAAAECV42V2AeWRl5enkydPKiAgQBaLxexyAABAKRiGofPnzyssLEweHiX3kVTLgHLy5EmFh4ebXQYAACiHY8eOqUmTJiW2qZYBJSAgQJL9BwwMDDS5GgAAUBrp6ekKDw93fI6XpFoGlPzTOoGBgQQUAACqmdIMz2CQLAAAqHIIKAAAoMohoAAAgCqnWo5BAWq63NxcZWdnm10GAJSJp6envLy8XDIFCAEFqGIyMjJ0/PhxGYZhdikAUGZ+fn4KDQ2Vt7d3hfZDQAGqkNzcXB0/flx+fn5q1KgRExECqDYMw1BWVpbOnDmjxMREtW7d+pqTsZWEgAJUIdnZ2TIMQ40aNZKvr6/Z5QBAmfj6+qpOnTo6evSosrKyVLdu3XLvi0GyQBVEzwmA6qoivSZO+3HJXgAAAFyIgAIAQDVXE6/6I6AAAKq03r1769ChQ8rMzNQtt9yiPXv21Oo6JGnDhg2677771LJlS1mtVjVr1qzGXflHQAEAVGnjx49Xx44d5e/vr4YNG6pDhw5lev6oUaM0bNgw0+twlcWLF2vo0KHq3r27li9froSEBO3YsaPGjV3jKp6CNm+WPvlE6tRJevxxs6sBAEj64x//qGHDhikjI0ONGzeu1XVkZGRo/PjxWrZsme644w5Taqgs9KAUtGePNG+etGKF2ZUAdoYhXbhgzlLG7uINGzbIYrE4LTabzanNsWPHNGLECNlsNgUFBenuu+/WkSNHHNuL+kt30aJFV+1nz549GjRokPz9/RUcHKyHH35Yv/32m2N73759NXHiRKfnzJo1S127dnU8Llxr/tK3b1+nWv72t7+pUaNGCgwM1Lhx45SVleXY5+rVq3XzzTfLZrOpQYMGuvPOO3X48OGrjk3fvn2vep25c+dKko4cOSKLxaKdO3c62s+YMcOpTWpqqnr27Cmr1SpfX1/deOONWrVqlaN9Xl6eXnzxRTVp0kQ+Pj7q2rWrVq9e7die/xr5S1BQkO69916dPXvW0eb1119Xp06dVK9ePYWHh+upp55SRkZGie9D4drz/w2kpqY6tbNYLPr888+L/XkLstlsWrRo0VVt/fz81Lhx46uOTVEuXLig++67T76+vhoyZIguXryo7OxsjRgxQr6+vrrjjjt05swZR/trvY9lqWPUqFFXvdcF/y0mJSXp7rvvlr+/vwIDAzVixAilpKQ47eOdd95Ry5Yt5e3trTZt2ui///u/Hdu+/fZb+fr6avny5QoLC5Ofn5+ioqK0d+9eR5tFixbJYrHorrvuctrvG2+8IYvFolGjRjnWXb58Wc8884yuu+461atXT7169dKGDRuc9nWt991dCCgF+fjYv16+bG4dQL6LFyV/f3OWixfLVfKBAwd06tSpq35xZ2dna8CAAQoICNC3336rzZs3y9/fXwMHDnT60L+W1NRU/eEPf1BERIS2b9+u1atXKyUlRSNGjCj1Pp555hmdOnVKp06d0pQpUxQZGen4ftmyZY52cXFx2r9/vzZs2KCPPvpIy5Yt09/+9jfH9gsXLmjy5Mnavn274uLi5OHhoXvuuUd5eXlOr2cYhsaMGeN4jSZNmhRb2/HjxzV37lyneXC8vb31l7/8Rdu2bdPevXvVv39/DR8+XJf/73fVG2+8oddee01z5szR7t27NWDAAN111106ePCg077Xrl2rU6dO6euvv9YPP/ygV155xbHNw8ND8+bN0969e/Xvf/9b69at09SpU0t9TCtDUcemKC+++KJ27Nih9evX67HHHtPKlSsVFxenwYMHKz4+XufOndOECRMc7Uv7PpamDsMwNHDgQMd7HRkZ6diWl5enu+++W+fOndPGjRu1Zs0a/frrr3rggQccbZYvX64JEyZoypQp2rNnj5544gk9+uijWr9+vSTpzJkzOnXqlDZs2KClS5dq69atCggI0MCBA3Xp0iXHfvz8/BQfH68TJ0441r333nu67rrrnOodP3684uPjtXTpUu3evVv333+/Bg4ceNW/HTNwiqcgAgpQbvkflvl/iVmtVqftH3/8sfLy8vTBBx84zpUvXLhQNptNGzZsUP/+/Uv1Ov/1X/+liIgI/fOf/3SsW7BggcLDw/XLL7/ohhtuuOY+/P395e/v73js7e2tkJCQq9p5e3trwYIF8vPzU4cOHfTiiy/q2Wef1d///nd5eHho+PDhTu0XLFigRo0aad++ferYsaNjfXZ2tqxWq+M1PD09i63t+eef1wMPPKC1a9c61vn5+Tl6lgzDUMuWLWWxWJSdnS0fHx/NmTNH06ZN04MPPihJmj17ttavX6+5c+fqrbfecuynQYMGjhp8fX2d3qOCf+U3b95c//jHPzRu3Di9/fbbJR7LylTUsSnKBx98oNmzZ+umm26SZP/QT01NdfQcxMbGavDgwXrnnXdktVpL/T6Wpo7s7Gz5+/s7jnPB6d7j4uL0008/KTExUeHh4ZKk//znP+rQoYO2bdumHj16aM6cORo1apSeeuopSdLkyZO1ZcsWzZkzR7fffrsjNH3wwQfq3bu3Yx9NmzbV4sWL9fj/DU+oU6eOHnroIS1YsEAzZszQd999J09PT3Xv3t1RT1JSkhYuXKikpCSFhYVJsof31atXa+HChU7/x8xAQCmIgIKqxs9PKtDNXumvXQZnz56Vl5eX/Ip53q5du3To0CEFBAQ4rc/MzCzytEhxdu3apfXr1zsCRkGHDx92BJS3335bH3zwgWNbVlaW2rdvX+rXkaQuXbo4/TyRkZHKyMjQsWPH1KxZMx08eFAzZ87U1q1b9dtvvzk+PJKSkpw+2NLT01WvXr1rvt6PP/6o5cuX68CBA0V++HXo0EEHDx6Uv7+/PvvsM/n7+ys9PV0nT55Unz59nNr26dNHu3btclrXu3dveXh46MKFC7r99ts1ZcoUx7a1a9cqNjZWP//8s9LT05WTk6PMzExdvHjRcQzS0tKcjntxV42U1ENUsBZPT0/ZbDb17t1br732WonPu9axyff777/r3LlzateunWOdl5eXvLyufNy1b99eubm5OnLkiLp06VLq97E0daSnp6thw4ZF1rZ//36Fh4c7wkl+LTabTfv371ePHj20f/9+jR071ul5ffr00RtvvOH08/Tq1cvxfUBAgLp06aJ9+/Y5PW/s2LG688479fzzz+u9997TmDFjFBcX59j+008/KTc396pQf/nyZTVo0MDxfWnfd1crU0CJjY3VsmXL9PPPP8vX11e9e/fW7Nmz1aZNG0ebvn37auPGjU7Pe+KJJzR//nzH90lJSXryyScdv2RGjhyp2NhYp39ApsgPKGXobgbcymKRSvHBVhX8+uuvatasWbFXEmRkZKhbt25avHjxVdsaNWpU6tfJyMjQ0KFDNXv27Ku2hYaGOh5HR0fr+eefd3w/b948bdq0qdSvUxpDhw5Vs2bN9P777yssLEx5eXnq2LHjVaesTp486fgLtSRTpkzRM8884/RzFLRy5Ur9/vvvmj9/vqZOnarbb7+9TPV+/PHHateunZKTkzVhwgQ988wzevPNN3XkyBHdeeedevLJJ/XSSy8pKChI3333nUaPHq2srCxHQAkICNCPP/7o2N+JEyccY3YK+vbbb52CaOvWrUus5emnn9a4ceO0ooTxf9c6NuWR/0Fb2vexNHWcPHlSnTt3dlmNhdWvX7/YbYX/73Xs2FFhYWFaunSpVqxYoXnz5jkFlIyMDHl6eiohIeGqXr2CgaS077urlSkRbNy4UTExMerRo4dycnL0l7/8Rf3799e+ffuc/joYM2aMXnzxRcf3Bf8Cyc3N1ZAhQxQSEqLvv/9ep06d0iOPPKI6deqY3p1EDwpQfhs3btQtt9xS7PYbb7xRH3/8sRo3bqzAwMByv86NN96ozz77TM2bNy/xjxqr1apWrVo5vg8KCirza+3atUuXLl1yjDXYsmWL/P39FR4errNnz+rAgQN6//33HT/3d999d9U+Dh8+rN9//10RERElvtaXX36pX375RV9//XWxbZo1a6ZmzZpp9uzZstls+umnn9S9e3eFhYVp8+bNuu222xxtN2/erJ49ezo9Pzw8XK1atVKrVq306KOP6uWXX9abb76phIQE5eXl6bXXXnNMU/7JJ59c9foeHh5Ox7S449+iRYurBlYWVrCW0aNHKzY2tti2pTk2+erXr+/okcjvVcrJyVFOTo6jzb59++Th4aHmzZuX+n0sTR0XLlzQ/v37NX369CK3t2vXTseOHdOxY8ccvSj79u1Tamqqo3evXbt22rx5s0aOHOl43ubNmx3b27Ztq5ycHG3dutVxiuf8+fPatWuXHn744ate84knntC4ceM0bNiwq96TiIgI5ebm6vTp0yX+3y3t++5qZXqVgqPCJfvo3saNGyshIUG33nqrY72fn1+R53Ml6X//93+1b98+rV27VsHBweratav+/ve/a9q0aZo1a1aFb89cIQQUoMyysrL01Vdfad26dfrss8+UnJwsyd4tbBiGzpw5o0aNGik6Olqvvvqq7r77bscVJ0ePHtWyZcs0depUR/d+Xl6eMjMzHfvPnyHz8uXL8vHxUUxMjN5//3099NBDmjp1qoKCgnTo0CEtXbpUH3zwQYnjO8rzs40ePVp//etfdeTIEb3wwgsaP368PDw8VL9+fTVo0EDvvfeeQkNDlZSUpOeee87p+du3b9fTTz+tTp06OZ37L8orr7yiN998s8hTZDt27NCJEyfUvn17Xbp0SXPnzpW/v7+jZ+LZZ5/VCy+8oJYtW6pr165auHChdu7ceVVv1dmzZ5WcnKzTp0/ro48+Utu2bSVJrVq1UnZ2tt58800NHTpUmzdvdur1doesrCxlZmYqJSVF/+///b8ix3rkK+nYFOWxxx5TbGysOnbsqBMnTujzzz9XTk6OFi1apK5du2r69OkaPny4bDab8vLyrvk+lqaOn3/+WVOnTpXNZtOgQYOKfH5UVJQ6deqk6OhozZ07Vzk5OXrqqad02223Of59PPvssxoxYoQiIiIUFRWlr776SsuWLXOcTmrTpo0GDRqkxx9/XO+++65sNptmzpwpf39//fGPf7zqNUeMGKHk5OSrruiRpBtuuEHR0dF65JFH9NprrykiIkJnzpxRXFycOnfurCFDhpTqeLtLha7iSUtLk3T1XyaLFy9Ww4YN1bFjR02fPl0XC1wNEB8fr06dOik4ONixbsCAAUpPT3e6TMoUBBSgzL7//nvdd999ysvL0z333KPQ0FCFhoZq4sSJSk9PV48ePSTZ/3DZtGmTmjZtqnvvvVft2rXT6NGjlZmZ6dSj8tVXX8nX19exjB07VmlpaY5Tyfm9Bbm5uerfv786deqkiRMnymazuewmZfn69eun1q1b69Zbb9UDDzygu+66S7NmzZJk/6ty6dKlSkhIUMeOHTVp0iS9+uqrTs+fNGmSmjRpopUrV15zEq1WrVo5/dVc0KVLlzRjxgx16tRJffr0cfwVnz/I9emnn9bkyZM1ZcoUderUSatXr9aXX3551amVqKgohYaG6rbbblNQUJBjjE6XLl30+uuva/bs2erYsaMWL15cYo+GK/Tq1Uu+vr7q2rWr/P399e677xbbtqRjU5RZs2apc+fO6tu3rxYsWKAhQ4YoKipKq1at0k033SSr1ao333xTUunex9LUMWvWLOXk5Gjt2rVFjo+S7KdgvvjiC9WvX1+33nqroqKidP311+vjjz92tBk2bJjeeOMNzZkzRx06dNC7776rhQsXOp1S+c9//qOIiAgNHTpUvXr1UkZGhr755psiryry9fXVtGnTnMbkFLRw4UI98sgjmjJlitq0aaNhw4Zp27Ztatq0aZHtK5PFKOdol7y8PN11111KTU116g5777331KxZM4WFhWn37t2aNm2aevbs6bh0b+zYsTp69Ki++eYbx3MuXryoevXqaeXKlUUmz8uXLzuuEJDsg5DCw8OVlpZWoa7iq+zaJXXtKoWESKdOuW6/QCllZmYqMTFRLVq0qNBtyivThg0bNGvWLKe5E/Klpqaqa9euTnOdlIer9lMWo0aNUmpqqmP+DlRfvJeVq6TfY+np6bJaraX6/C73iaSYmBjt2bPnqnN1BUcfd+rUSaGhoerXr58OHz6sli1bluu1YmNjneYecBt6UIAy8/b2LnZ8h4eHR5kGwBbHYrHIJ///J4BaoVz9oePHj9eKFSu0fv36a15Oln8p1KFDhyRJISEhV82al/99ceNWpk+frrS0NMdy7Nix8pR9bQQUoMx69+7tNLlZQYGBgdq2bVuFX8NqterAgQMV3g+A6qNMPSiGYejPf/6zli9frg0bNqhFixbXfE7+VLj5l2RFRkbqpZde0unTpx33MlizZo0CAwOLnaPAx8encv56IqAA+D/5062j+uO9rJ7KFFBiYmK0ZMkSffHFFwoICHCM1s+/P8Thw4e1ZMkSDR48WA0aNNDu3bs1adIk3XrrrY7rwvv376/27dvr4Ycf1iuvvKLk5GT99a9/VUxMjPlduPmvn5trX1x4NQAAACi9Mp3ieeedd5SWlqa+ffs6RuqHhoY6RiB7e3tr7dq16t+/v9q2baspU6Zo+PDh+uqrrxz78PT01IoVK+Tp6anIyEj96U9/0iOPPOI0b4ppCgYkelFgosqaqREAXM1Vv7/KfIqnJOHh4VfNIluUZs2aaeXKlWV56cpROKCUcapvoKLy5/DIysq65g3RAKAqyp9apE6dOhXaD/fiKcjLyz61uGHQgwJT5N/L5syZM6pTp47L5/UAAHcxDEMXL17U6dOnZbPZKjxpIgGlIIvF3ouSmUlAgSksFotCQ0OVmJioo0ePml0OAJSZzWYr9qrcsiCgFEZAgcm8vb3VunXrIm9UBgBVWZ06dVx2uwkCSmFcaowqwMPDo9rMJAsA7sAJ7sIIKAAAmI6AUhgBBQAA0xFQCiOgAABgOgJKYQQUAABMR0ApjIACAIDpCCiFEVAAADAdAaUwb2/7VwIKAACmIaAURg8KAACmI6AURkABAMB0BJTCCCgAAJiOgFIYAQUAANMRUAojoAAAYDoCSmEEFAAATEdAKYyAAgCA6QgohRFQAAAwHQGlMAIKAACmI6AURkABAMB0BJTCCCgAAJiOgFIYAQUAANMRUAojoAAAYDoCSmEEFAAATEdAKSw/oGRlmVsHAAC1GAGlMHpQAAAwHQGlMAIKAACmI6AURkABAMB0BJTCCCgAAJiOgFIYAQUAANMRUAojoAAAYDoCSmEEFAAATEdAKaxgQDEMc2sBAKCWIqAUlh9QDEPKyTG3FgAAaikCSmH5AUXiNA8AACYhoBRGQAEAwHQElMI8Pe2LREABAMAkBJSicCUPAACmIqAUhYACAICpCChFIaAAAGAqAkpRCCgAAJiKgFIUAgoAAKYioBSFgAIAgKkIKEXx9rZ/JaAAAGAKAkpR6EEBAMBUBJSiEFAAADAVAaUoBBQAAExFQCkKAQUAAFMRUIpCQAEAwFQElKIQUAAAMBUBpSgEFAAATEVAKQoBBQAAUxFQikJAAQDAVASUohBQAAAwFQGlKAQUAABMRUApCgEFAABTlSmgxMbGqkePHgoICFDjxo01bNgwHThwwKlNZmamYmJi1KBBA/n7+2v48OFKSUlxapOUlKQhQ4bIz89PjRs31rPPPqucnJyK/zSuQkABAMBUZQooGzduVExMjLZs2aI1a9YoOztb/fv314ULFxxtJk2apK+++kqffvqpNm7cqJMnT+ree+91bM/NzdWQIUOUlZWl77//Xv/+97+1aNEizZw503U/VUURUAAAMJXFMAyjvE8+c+aMGjdurI0bN+rWW29VWlqaGjVqpCVLlui+++6TJP38889q166d4uPjddNNN2nVqlW68847dfLkSQUHB0uS5s+fr2nTpunMmTPy9va+5uump6fLarUqLS1NgYGB5S2/eB9+KD3+uDRkiLRihev3DwBALVSWz+8KjUFJS0uTJAUFBUmSEhISlJ2draioKEebtm3bqmnTpoqPj5ckxcfHq1OnTo5wIkkDBgxQenq69u7dW+TrXL58Wenp6U6LW9GDAgCAqcodUPLy8jRx4kT16dNHHTt2lCQlJyfL29tbNpvNqW1wcLCSk5MdbQqGk/zt+duKEhsbK6vV6ljCw8PLW3bp5AeUrCz3vg4AAChSuQNKTEyM9uzZo6VLl7qyniJNnz5daWlpjuXYsWPufUF6UAAAMJVXeZ40fvx4rVixQps2bVKTJk0c60NCQpSVlaXU1FSnXpSUlBSFhIQ42vzwww9O+8u/yie/TWE+Pj7yyQ8NlYGAAgCAqcrUg2IYhsaPH6/ly5dr3bp1atGihdP2bt26qU6dOoqLi3OsO3DggJKSkhQZGSlJioyM1E8//aTTp0872qxZs0aBgYFq3759RX4W1yGgAABgqjL1oMTExGjJkiX64osvFBAQ4BgzYrVa5evrK6vVqtGjR2vy5MkKCgpSYGCg/vznPysyMlI33XSTJKl///5q3769Hn74Yb3yyitKTk7WX//6V8XExFRuL0lJCCgAAJiqTAHlnXfekST17dvXaf3ChQs1atQoSdK//vUveXh4aPjw4bp8+bIGDBigt99+29HW09NTK1as0JNPPqnIyEjVq1dPI0eO1Isvvlixn8SVCCgAAJiqQvOgmMXt86Ds3St17Cg1bCidOeP6/QMAUAtV2jwoNRY9KAAAmIqAUhQCCgAApiKgFKXgRG3V7wwYAADVHgGlKAWvJmI2WQAAKh0BpSgFAwqneQAAqHQElKIUvKMyAQUAgEpHQCmKh4dUp479MQEFAIBKR0ApDlfyAABgGgJKcQgoAACYhoBSnPxxKAQUAAAqHQGlOPSgAABgGgJKcQgoAACYhoBSHAIKAACmIaAUh4ACAIBpCCjFIaAAAGAaAkpxCCgAAJiGgFIcAgoAAKYhoBSHgAIAgGkIKMUhoAAAYBoCSnEIKAAAmIaAUhwCCgAApiGgFIeAAgCAaQgoxSGgAABgGgJKcQgoAACYhoBSHAIKAACmIaAUh4ACAIBpCCjFIaAAAGAaAkpxCCgAAJiGgFIcAgoAAKYhoBQnP6BkZZlbBwAAtRABpTj0oAAAYBoCSnEIKAAAmIaAUhwCCgAApiGgFIeAAgCAaQgoxSGgAABgGgJKcQgoAACYhoBSHAIKAACmIaAUh4ACAIBpCCjFIaAAAGAaAkpx8gNKTo6Ul2duLQAA1DIElOLkBxSJXhQAACoZAaU4BBQAAExDQClOnTpXHhNQAACoVASU4lgskre3/TEBBQCASkVAKQlX8gAAYAoCSkkIKAAAmIKAUhICCgAApiCglISAAgCAKQgoJSGgAABgCgJKSQgoAACYgoBSEgIKAACmIKCUhIACAIApCCglIaAAAGAKAkpJCCgAAJiCgFISAgoAAKYgoJSEgAIAgCnKHFA2bdqkoUOHKiwsTBaLRZ9//rnT9lGjRslisTgtAwcOdGpz7tw5RUdHKzAwUDabTaNHj1ZGRkaFfhC3IKAAAGCKMgeUCxcuqEuXLnrrrbeKbTNw4ECdOnXKsXz00UdO26Ojo7V3716tWbNGK1as0KZNmzR27NiyV+9uBBQAAEzhVdYnDBo0SIMGDSqxjY+Pj0JCQorctn//fq1evVrbtm1T9+7dJUlvvvmmBg8erDlz5igsLKysJbkPAQUAAFO4ZQzKhg0b1LhxY7Vp00ZPPvmkzp4969gWHx8vm83mCCeSFBUVJQ8PD23durXI/V2+fFnp6elOS6UgoAAAYAqXB5SBAwfqP//5j+Li4jR79mxt3LhRgwYNUm5uriQpOTlZjRs3dnqOl5eXgoKClJycXOQ+Y2NjZbVaHUt4eLiryy4aAQUAAFOU+RTPtTz44IOOx506dVLnzp3VsmVLbdiwQf369SvXPqdPn67Jkyc7vk9PT6+ckEJAAQDAFG6/zPj6669Xw4YNdejQIUlSSEiITp8+7dQmJydH586dK3bcio+PjwIDA52WSkFAAQDAFG4PKMePH9fZs2cVGhoqSYqMjFRqaqoSEhIcbdatW6e8vDz16tXL3eWUDQEFAABTlPkUT0ZGhqM3RJISExO1c+dOBQUFKSgoSH/72980fPhwhYSE6PDhw5o6dapatWqlAQMGSJLatWungQMHasyYMZo/f76ys7M1fvx4Pfjgg1XrCh6JgAIAgEnK3IOyfft2RUREKCIiQpI0efJkRUREaObMmfL09NTu3bt111136YYbbtDo0aPVrVs3ffvtt/LJ/7CXtHjxYrVt21b9+vXT4MGDdfPNN+u9995z3U/lKvk1Z2WZWwcAALVMmXtQ+vbtK8Mwit3+zTffXHMfQUFBWrJkSVlfuvLRgwIAgCm4F09JCCgAAJiCgFISAgoAAKYgoJSEgAIAgCkIKCUhoAAAYAoCSkkIKAAAmIKAUhICCgAApiCglISAAgCAKQgoJSGgAABgCgJKSQgoAACYgoBSEm9v+9e8PCknx9xaAACoRQgoJSlw/yB6UQAAqDwElJIQUAAAMAUBpSReXpLFYn9MQAEAoNIQUEpisTBQFgAAExBQroWAAgBApSOgXAsBBQCASkdAuRYCCgAAlY6Aci0EFAAAKh0B5VoIKAAAVDoCyrUQUAAAqHReZhdQ5eUHlA8/tF923Lev5OtrakkAANR09KBcS9u29q/LlkmDB0sNGkhDhkhff21uXQAA1GAWwzAMs4soq/T0dFmtVqWlpSkwMNC9L5aVJa1cKa1aZf96/Lh9fb160vnzV2aaBQAAJSrL5zc9KNfi7S0NGya9+66UlCTt2GFff+GClJpqZmUAANRYBJSysFikrl2lgAD792fOmFoOAAA1FQGlPBo1sn8loAAA4BYElPIgoAAA4FYElPIgoAAA4FYElPIgoAAA4FYElPIgoAAA4FYElPJo3Nj+lYACAIBbEFDKgx4UAADcioBSHgQUAADcioBSHgQUAADcioBSHvkB5fRpqfrdyggAgCqPgFIe+QElK8t+w0AAAOBSBJTy8POzLxKneQAAcAMCSnkxDgUAALchoJQXAQUAALchoJQXAQUAALchoJQXAQUAALchoJQX090DAOA2BJTyogcFAAC3IaCUFwEFAAC3IaCUFwEFAAC3IaCUFwEFAAC3IaCUV8H78QAAAJcioJRXfkC5dEm6cMHcWgAAqGEIKOXl7y/5+Ngfc5oHAACXIqCUl8XCOBQAANyEgFIRBBQAANyCgFIRBBQAANyCgFIRBBQAANyCgFIR3I8HAAC3IKBUBD0oAAC4BQGlIggoAAC4RZkDyqZNmzR06FCFhYXJYrHo888/d9puGIZmzpyp0NBQ+fr6KioqSgcPHnRqc+7cOUVHRyswMFA2m02jR49WRkZGhX4QUxBQAABwizIHlAsXLqhLly566623itz+yiuvaN68eZo/f762bt2qevXqacCAAcrMzHS0iY6O1t69e7VmzRqtWLFCmzZt0tixY8v/U5iFgAIAgFtYDMMwyv1ki0XLly/XsGHDJNl7T8LCwjRlyhQ988wzkqS0tDQFBwdr0aJFevDBB7V//361b99e27ZtU/fu3SVJq1ev1uDBg3X8+HGFhYVd83XT09NltVqVlpamwMDA8pZfcQcPSjfcYJ9V9vx58+oAAKAaKMvnt0vHoCQmJio5OVlRUVGOdVarVb169VJ8fLwkKT4+XjabzRFOJCkqKkoeHh7aunVrkfu9fPmy0tPTnZYqIb8HJSNDKtBDBAAAKsalASU5OVmSFBwc7LQ+ODjYsS05OVmN8y/P/T9eXl4KCgpytCksNjZWVqvVsYSHh7uy7PKzWqU6deyPOc0DAIDLVIureKZPn660tDTHcuzYMbNLsrNYpIYN7Y8JKAAAuIxLA0pISIgkKSUlxWl9SkqKY1tISIhOnz7ttD0nJ0fnzp1ztCnMx8dHgYGBTkuVwUBZAABczqUBpUWLFgoJCVFcXJxjXXp6urZu3arIyEhJUmRkpFJTU5WQkOBos27dOuXl5alXr16uLKdyEFAAAHA5r7I+ISMjQ4cOHXJ8n5iYqJ07dyooKEhNmzbVxIkT9Y9//EOtW7dWixYtNGPGDIWFhTmu9GnXrp0GDhyoMWPGaP78+crOztb48eP14IMPluoKniqHgAIAgMuVOaBs375dt99+u+P7yZMnS5JGjhypRYsWaerUqbpw4YLGjh2r1NRU3XzzzVq9erXq1q3reM7ixYs1fvx49evXTx4eHho+fLjmzZvngh/HBNyPBwAAl6vQPChmqTLzoEjSP/4hzZghPf649P775tYCAEAVZto8KLUSp3gAAHA5AkpFEVAAAHA5AkpFEVAAAHA5AkpF5QeUQnO7AACA8iOgVFR+QElLk7KyzK0FAIAagoBSUfXrS56e9se//WZuLQAA1BAElIry8JAaNLA/ZhwKAAAuQUBxBQbKAgDgUgQUVyCgAADgUgQUVyCgAADgUmW+Fw+KkH8/nqNHnUNKQIBU4B5EAACgdOhBcYX8HpTXX7eHlfwlOFg6csTU0gAAqI4IKK4wcKBks129Pj1dWreu0ssBAKC6I6C4Qq9e0u+/S4ZxZXn6afu2ffvMrQ0AgGqIgOIu7dvbvxJQAAAoMwKKuxBQAAAoNwKKu+QHlKNHpYwMc2sBAKCaIaC4S4MGVy4//vlnc2sBAKCaIaC4E6d5AAAoFwKKO3XoYP+6d6+5dQAAUM0QUNyJHhQAAMqFgOJOBBQAAMqFgOJO+QElMVG6eNHcWgAAqEYIKO7UqJH9ah7DkA4cMLsaAACqDQKKO1ksVwbKcpoHAIBSI6C4G+NQAAAoMwKKu+UHFC41BgCg1Ago7kYPCgAAZUZAcbf8gHL4sJSZaW4tAABUEwQUdwsJkerXl/LypF9+MbsaAACqBQKKu1ksnOYBAKCMCCiVgYACAECZEFAqAwEFAIAyIaBUBgIKAABlQkCpDPmzyR48KGVlmVsLAADVAAGlMoSFSYGBUk6OPaQAAIASEVAqA1fyAABQJgSUykJAAQCg1AgolYWAAgBAqRFQKkt+QFm/Xpo71z6rrGGYWhIAAFUVAaWydO8u1a0rnTkjTZoktWkjtW4tTZggJSebXR0AAFUKAaWyNGok7d8vvf661K+fVKeO/QaC8+ZJM2eaXR0AAFUKAaUyNW9u7z1Zu1Y6e1b617/s67/+mtM9AAAUQEAxS0CANG6c5OcnnTwp7d5tdkUAAFQZBBQz1a1rP90jSStXmlsLAABVCAHFbIMH278SUAAAcCCgmG3QIPvX77+Xfv/d3FoAAKgiCChma9bMPkdKXp60Zo3Z1QAAUCUQUKoCTvMAAOCEgFIV5AeUVavsPSkAANRyBJSqoE8fyd9fOn1a+vFHs6sBAMB0BJSqwNtbuuMO++NVq8ytBQCAKoCAUlUwDgUAAAcCSlWRf7nx1q3Sb7+ZWwsAACYjoFQV110nde5svyfPN9+YXQ0AAKYioFQlnOYBAECSGwLKrFmzZLFYnJa2bds6tmdmZiomJkYNGjSQv7+/hg8frpSUFFeXUT3lB5TVq6UPP7yyLFgg/fqrubUBAFCJvNyx0w4dOmjt2rVXXsTrystMmjRJX3/9tT799FNZrVaNHz9e9957rzZv3uyOUqqXyEjJZpPOnZMef9x5W4sW0sGDkqenKaUBAFCZ3BJQvLy8FBISctX6tLQ0ffjhh1qyZIn+8Ic/SJIWLlyodu3aacuWLbrpppvcUU714eUlvfee9D//Yx+Lkm/9eikxUYqLk/r3N68+AAAqiVvGoBw8eFBhYWG6/vrrFR0draSkJElSQkKCsrOzFRUV5Wjbtm1bNW3aVPHx8cXu7/Lly0pPT3daaqz775e++EL68ssry8iR9m0LFphbGwAAlcTlAaVXr15atGiRVq9erXfeeUeJiYm65ZZbdP78eSUnJ8vb21s2m83pOcHBwUpOTi52n7GxsbJarY4lPDzc1WVXbaNH278uX24//QMAQA3n8oAyaNAg3X///ercubMGDBiglStXKjU1VZ988km59zl9+nSlpaU5lmPHjrmw4mogIkLq2lXKypIWLza7GgAA3M7tlxnbbDbdcMMNOnTokEJCQpSVlaXU1FSnNikpKUWOWcnn4+OjwMBAp6XWeewx+1dO8wAAagG3B5SMjAwdPnxYoaGh6tatm+rUqaO4uDjH9gMHDigpKUmRkZHuLqV6i46237Nn505pxw6zqwEAwK1cHlCeeeYZbdy4UUeOHNH333+ve+65R56ennrooYdktVo1evRoTZ48WevXr1dCQoIeffRRRUZGcgXPtQQFSffcY3/84Yfm1gIAgJu5PKAcP35cDz30kNq0aaMRI0aoQYMG2rJlixo1aiRJ+te//qU777xTw4cP16233qqQkBAtW7bM1WXUTPmDZRcvljIzza0FAAA3shhGwQk3qof09HRZrValpaXVrvEoubnS9ddLSUnSkiXSQw+ZXREAAKVWls9v7sVTnXh6SqNG2R8zWBYAUIPRg1LdHDlin/Zekj76SAoIuLKteXOpQwczqgIA4JrK8vntlqnu4UbNm0v9+tmnvS98isfLS9q6VbrxRlNKAwDAVQgo1dFLL9knbbt06cq606ftY1MmTJA2bZIsFvPqAwCggggo1VGvXvYQUtDx41KbNtJ330mffCI98IA5tQEA4AIMkq0pmjSRpk2zP546Vbp40dx6AACoAAJKTfLMM1LTpvZTPXPmmF0NAADlRkCpSfz8pFdesT9++WWptt1UEQBQYxBQapoRI6Sbb7YPoH3uObOrAQCgXBgkW9NYLNIbb0jdu9tnmx0yxH5pcr6gIKltW9PKAwCgNOhBqYluvFF67DH74+hoqU+fK0u7dtJf/mJufQAAXAM9KDXVP/8pHTwonTx5ZZ1hSIcPS7Gx9l6VsWNNKw8AgJLQg1JTNW4sbdxoDyn5y6FD0qxZ9u1PPSWtXm1qiQAAFIeAUtvMnCk98oj9zsgjRki7dpldEQAAVyGg1DYWi/T++1LfvtL58/ZBtCdOmF0VAABOCCi1kbe3tGyZ/WqeEyek226T/vEP6ccfpbw8s6sDAICAUmvVry+tXCkFB9sHzs6YIXXrJl13nf0KoJ07za4QAFCLEVBqsxYtpD17pHffle6+W6pXT0pOlhYulHr3lpYvN7tCAEAtRUCp7Ro2tF9u/Pnn0tmz0po1Uv/+9plohw+X5s41u0IAQC1EQMEVPj5SVJT09dfSuHH2eVMmTZImTLBf9QMAQCVhojZczctLevtt6frrpalTpXnzpF9+kW65xbldt27SgAHm1AgAqNEshmEYZhdRVunp6bJarUpLS1NgYKDZ5dRsn34qPfywdPly0dunTbPPWutBZxwAoGRl+fymBwUlu/9++2DaBQukrKwr61NTpc8+k2bPlhITpX//W6pb17QyAQA1CwEF19a9u30p7N//lh5/XPrkE+n4cemLL+yDbgEAqCACCspv5EgpPFy6917p+++lyEj74FqL5Uqb+vWlBx6Q/PzMqxMAUO0wBgUVt2+fNHiwdPRo0dubNJFefdUeVAqGFwBArVKWz28CClwjOdk+HuXMGef1334rJSXZH/fpI73xhv3qHwBArUNAQdVx6ZL02mtSbKx08aK9B6VXL6lOnStt6tSxD8YdM0by9DSvVgCAWxFQUPUcPy4995y0eHHxbTp3ts9ce/vtlVYWAKDyEFBQde3ebZ/0raDERHsPy++/278fPlx66SWpcWPndjYbY1gAoBojoKD6OXtWeuEF6Z13pLy8otu0bGkfbDtsGEEFAKqhsnx+M/0nqoYGDaT/+i9p507pjjuKbnP4sP2S5jvusN+FGQBQY9GDgqopJ8f5+4sXpVdekebMsU+77+EhPfGE1KOHczur1T6GpX79yqsVAFAqnOJBzZWYKD37rH2a/eJ4eEi9e9vnZhk8WGrd2vmUkKen5O3t/loBAE4IKKj51q+3j1e5eNF5fWKifeK4a+ne/UqA6d6dy5sBoBIQUFC7HT0qrVxpX+Li7HOxlKRhQ6lnT8mr0J0f2ra1B5jevZ3nbQEAlAsBBciXkyNlZjqvS02V1q61B5hvvpHS00veR2Cg1L+/PawMHCiFhrqtXACoyQgoQGllZ9tvdHjw4NXr4+OlVauk335z3nbjjVdOD/XoUbrTQ1wWDQAEFMBlcnOl7dvtvS1ffy0lJJR9H97e0q23Xgk1N9xAYAFQKxFQAHdJSZFWr75yeigtrez7uP56ey+MR4FpiCwWqWtXe4Dp1IkAA6BGIqAAlSEnxz6e5VrOnLGHma+/ljZutJ8+Ksl110mDBkl9+0p+fs7bmjSx3w3agzkWAVQ/BBSgqsrIkNatk5KSnNdnZkqbNtmvOip86XRhjRrZB+sOHmwfvBsU5L56AcCFCChAdZWZae9lWblS2rHD+b5EhmGf4r/wVUflmXTO09N+aXX+uJgOHTitBMDtCChATZV/1VH+PC+uuidRkybSzTeXL+zUr2/vySnqlBQAFEBAAWqL33679kR0Rck/1bRypf1r4bliyqNuXXtIGTxYatWqfPvo0EFq2rTitQCokggoAErv0iVpwwZp7177aaSyOnzYHnSOHXNNPR062EPOoEFSnz7cNwmoQQgoACqXYdjvgbRypfS//yudO1f2fWRl2fdRcNyNt7e9Z8YdPDykiIgr43DatWMcDuBmBBQA1dO5c9KaNfags2qV/RLtytK0qXTbbZKvb+W9ps0m3XGHdMstko9P5b0uYBICCoDqLy9POnLEPpuvO1y6dOWKqfXrpcuX3fM6pVGvnhQVdWWm4aomJERq04YeJlQYAQUAyuLiRXtI2bGjfONwyisx0d5TlJxcea9ZXs2aXTkd9oc/cMUWyoWAAgDVRV6etGvXldsnnD1rdkXODEP69VfnHiZvb/vl5TXFDTdcCV/casKtCCgAANe5cMF+pVf+TTOPHjW7Ive57jr7uCCr1exKzNe7tzRihEt3SUABALiHYdhPTV24YHYlrpGTI23ZYg9fcXHlm1eopnriCWn+fJfusiyf314ufWUAQM1msdjvyF2TRERITz555VYT339vDy61Xc+epr48AQUAAMk+586AAfYFpuOe7QAAoMoxNaC89dZbat68uerWratevXrphx9+MLMcAABQRZgWUD7++GNNnjxZL7zwgn788Ud16dJFAwYM0OnTp80qCQAAVBGmBZTXX39dY8aM0aOPPqr27dtr/vz58vPz04IFC8wqCQAAVBGmBJSsrCwlJCQoKirqSiEeHoqKilJ8fLwZJQEAgCrElKt4fvvtN+Xm5io4ONhpfXBwsH7++eer2l++fFmXC8ximJ6e7vYaAQCAearFVTyxsbGyWq2OJTw83OySAACAG5kSUBo2bChPT0+lpKQ4rU9JSVFISMhV7adPn660tDTHcuzYscoqFQAAmMCUgOLt7a1u3bopLi7OsS4vL09xcXGKjIy8qr2Pj48CAwOdFgAAUHOZNpPs5MmTNXLkSHXv3l09e/bU3LlzdeHCBT366KNmlQQAAKoI0wLKAw88oDNnzmjmzJlKTk5W165dtXr16qsGzgIAgNqHuxkDAIBKUZbP72pxFQ8AAKhdquXdjPM7fZgPBQCA6iP/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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "values = np.arange(2, 100)\n",
    "\n",
    "plt.plot(values, list(map(lambda x: simulate(x, 100, False), values)), color = 'red', label = 'децентрализованный файлообмен')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2c29bd6",
   "metadata": {},
   "source": [
    "## Вывод"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ab5c72a",
   "metadata": {},
   "source": [
    "Нужные мне закономерности получены и обработы, это сильно поможет при оценке PeasCLI. Между прочим, у каждой из архитектур есть свои плюсы и минусы, параллельный файлообмен гораздо быстрее, однако каждый участник сети будет знать IP-адресс другого. Любой из этих вариантов нужно правильно подбирать под требования задачи."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
